﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PersonalAccounting.Business;

namespace PersonalAccounting.Forms
{
    public partial class FormConsEstadoDeCuenta : Form
    {

        #region Attributes

        private MovimientoFacade facade;

        private double saldoInicial;
        private List<Movimiento> resultado;
        
        #endregion

        #region Form

        public FormConsEstadoDeCuenta()
        {
            facade = new MovimientoFacade();

            saldoInicial = 0;
            resultado = null;

            InitializeComponent();
        }

        private void FormConsEstadoDeCuenta_Load(object sender, EventArgs e)
        {
            cboCuenta.CargarCuentas();
            dtpDesde.Value = DateTime.Today.AddDays(-7);
            dtpHasta.Value = DateTime.Today;
        }

        #endregion

        #region Properties

        public DateTime Desde
        {
            get { return dtpDesde.Value; }
            set { dtpDesde.Value = value; }
        }

        public DateTime Hasta
        {
            get { return dtpHasta.Value; }
            set { dtpHasta.Value = value; }
        }

        public Cuenta CuentaSeleccionada
        {
            get { return cboCuenta.Value; }
            set { cboCuenta.Value = value; }
        }

        #endregion


        #region Click

        public void btnConsultar_Click(object sender, EventArgs e)
        {
            CargarDatos();
            MostrarDatos();
        }

        private void btnCerrar_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        #endregion

        #region SelectedIndexChanged

        private void cboCuenta_SelectedIndexChanged(object sender, EventArgs e)
        {
            LimpiarForm();
        }

        #endregion

        #region ValueChanged

        private void Fecha_ValueChanged(object sender, EventArgs e)
        {
            LimpiarForm();
        }

        #endregion



        private void LimpiarForm()
        {
            lvDatos.Items.Clear();
        }

        private void CargarDatos()
        {
            DateTime desde = dtpDesde.Value, hasta = dtpHasta.Value;
            Cuenta cuenta = cboCuenta.Value;

            saldoInicial = facade.GetSaldoInicial(desde, cuenta);
            resultado = facade.GetMovtosPeriodo(desde, hasta, cuenta);
        }

        private void MostrarDatos()
        {
            ListViewItem item = null;
            double saldo = 0;
            string format = "###,###,###,###.00";

            LimpiarForm();

            // Saldo inicial
            saldo = saldoInicial;

            if (saldoInicial != 0)
            {
                item = lvDatos.Items.Add(string.Empty);

                for (int i = 0; i < 4; i++)
                    item.SubItems.Add(string.Empty);

                item.SubItems[2].Text = "SALDO INICIAL";
                item.SubItems.Add(saldo.ToString(format));
                item.Font = new Font(item.Font, FontStyle.Bold);
            }

            // Movimientos
            foreach (Movimiento mov in resultado)
            {
                item = lvDatos.Items.Add(mov.Fecha.ToShortDateString());

                item.SubItems.Add(mov.Tipo);
                item.SubItems.Add(mov.Descripcion);

                if (mov.Importe > 0)
                {
                    item.SubItems.Add(mov.Importe.ToString(format));
                    item.SubItems.Add(string.Empty);
                }
                else
                {
                    item.SubItems.Add(string.Empty);
                    item.SubItems.Add(mov.Importe.ToString(format));
                }

                saldo += mov.Importe;

                item.SubItems.Add(saldo.ToString(format));

                if (item.Index % 2 != 0)
                    item.BackColor = Color.WhiteSmoke;
            }

            // Saldo Final
            if (lvDatos.Items.Count > 0)
            {
                item = lvDatos.Items.Add(string.Empty);

                for (int i = 0; i < 4; i++)
                    item.SubItems.Add(string.Empty);

                item.SubItems[2].Text = "SALDO FINAL";
                item.SubItems.Add(saldo.ToString(format));
                item.Font = new Font(item.Font, FontStyle.Bold);

                if (item.Index % 2 != 0)
                    item.BackColor = Color.WhiteSmoke;
            }
        }

    }
}